package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.sky.mapper.ShoppingCartMapper;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

@Service
@Slf4j
public class ShoppingCartServiceImpl implements ShoppingCartService {
    @Autowired
    private ShoppingCartMapper shoppingCartMapper;
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetmealMapper setmealMapper;

    /*新增购物车*/
    @Override
    public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
        //1.判断新增的商品是否已经存在？ 根据DTO中的菜品id或套餐id 和 用户id查询购物车表
        ShoppingCart shoppingCart = new ShoppingCart();
        // 属性拷贝
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        // 获取当前userid
        Long userId = BaseContext.getCurrentId(); // 设置userid
        shoppingCart.setUserId(userId);
        // 调用mapper层方法 查询数据
        List<ShoppingCart> data = shoppingCartMapper.list(shoppingCart);
        // 判断查询到数据没有
        if (data != null && data.size() > 0) {
            // 当前集合不为空，就商品数量*2, 注意查询到的数据可能的情况，1.没有查询到，说明当前购物车不存在此新增的商品数据。2.查询到，但有且仅有一条数据，因为购物车的逻辑是 如果有商品再添加就是数量增加，不会重复插入数据到数据表中
            // 获取数据
            shoppingCart = data.get(0);
            // 获取当前商品数量和单价用于计算金额
            Integer number = shoppingCart.getNumber();
            // 将商品数量 + 1,调用mapper层方法修改商品数量
            shoppingCart.setNumber(number + 1);
            // TODO 修改购物车的价格，随着商品数量而变化
            shoppingCartMapper.updateNumberById(shoppingCart);
        } else {
            // 商品不存在的逻辑，插入此次新增的商品数据，但是需要判断是菜品还是套餐
            Long dishId = shoppingCartDTO.getDishId(); // 获取菜品id
            Long setmealId = shoppingCartDTO.getSetmealId(); // 获取套餐id
            if (dishId != null) {
                // 表示是菜品的id，即当前新增购物车操作是菜品新增,获取菜品的名称，单价，和图片, 调用dishMapper
                Dish dish = dishMapper.getDishById(dishId);
                String dishName = dish.getName();
                String dishImage = dish.getImage();
                BigDecimal dishPrice = dish.getPrice();
                // 设置购物车对象属性和基础属性
                shoppingCart.setName(dishName);
                shoppingCart.setImage(dishImage);
                shoppingCart.setAmount(dishPrice);
            }
            if (setmealId != null) {
                // 表示套餐id不为空，当前加入购物车商品是套餐,与上述菜品操作相似
                Setmeal setmeal = setmealMapper.getById(setmealId);
                String setmealName = setmeal.getName();
                String setmealmage = setmeal.getImage();
                BigDecimal setmealPrice = setmeal.getPrice();
                // 设置购物车对象属性和基础属性
                shoppingCart.setName(setmealName);
                shoppingCart.setImage(setmealmage);
                shoppingCart.setAmount(setmealPrice);
            }
        }// end if-else
        shoppingCart.setCreateTime(LocalDateTime.now()); // 设置加入购物车时间
        shoppingCart.setNumber(1); // 设置商品初次加入购物车数量默认为 1
        // 调用购物车mapper插入方法
        shoppingCartMapper.insert(shoppingCart);
    } // end addShoppingCart

    /*查看购物车所有商品方法*/
    @Override
    public List<ShoppingCart> showShoppingCart() {
        /*只需要加上当前用户id查询购物车数据表即可，通过token获取当前用户id*/
        Long userId = BaseContext.getCurrentId();
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUserId(userId);
        return shoppingCartMapper.list(shoppingCart);
    }

    /*清空购物车方法*/
    @Override
    public void remove() {
        /*只需要加上当前用户id删除购物车数据表即可，通过token获取当前用户id*/
        Long userId = BaseContext.getCurrentId();
        ShoppingCart shoppingCart = new ShoppingCart();
        shoppingCart.setUserId(userId);
        shoppingCartMapper.remove(shoppingCart);
    }

    /*减少购物车商品方法*/
    @Override
    public void subtract(ShoppingCartDTO shoppingCartDTO) {
        /*考虑两种情况，1.如果当前商品数量为1则直接删除;2.如果当前商品数量不为1（>1），则数量 -1*/
        // 根据DTO转化为shoppingCart对象，并查询购物车表，查看当前商品数量
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
        log.info("shoppingCartDTO = {}", shoppingCartDTO);
        log.info("shoppingCart = {}", shoppingCart);
        Long userId = BaseContext.getCurrentId();
        log.info("userId = {}", userId);
        shoppingCart.setUserId(userId);
        // 查询数据库获取商品数量,根据userid setmealId or dishId 和dish_flavor查询数据库
        List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart); // 一定会查到购物车数据，因为是删除操作。
        shoppingCart = shoppingCartList.get(0);// 购物车对象属性更新为从数据库查到的全部数据
        Integer number = shoppingCart.getNumber(); // 商品数量
        log.info("减少购物车商品数量ServiceImpl,当前商品数量为{}", number);
        if (number > 1) {
            // 商品数量不为1,则商品数量 - 1
            shoppingCart.setNumber(number - 1);
            log.info("执行商品减少逻辑");
            // 修改数据库数据
            shoppingCartMapper.updateNumberById(shoppingCart);
        } else {
            log.info("执行商品删除逻辑");
            System.out.println("当前购物车id为：" + shoppingCart.getId());
            shoppingCartMapper.deleteById(shoppingCart.getId());
        }

    }
}
